package com.ts.api.module.match.plan.internal.distribute.strategy;

import com.ts.api.module.api.convert.core.handler.ApiConvertHandler;
import com.ts.api.module.api.convert.core.http.client.ApiHttpMessage;
import com.ts.api.module.match.plan.internal.distribute.model.PlanDistribute;
import com.ts.api.module.match.plan.internal.distribute.model.PlanDistributeField;
import com.ts.api.module.match.plan.internal.distribute.model.PlanDistributePost;
import com.ts.api.module.match.plan.internal.distribute.model.PlanDistributeResult;

/**
 *  计划分发策略
 */
public interface PlanDistributeStrategy<V extends ApiConvertHandler> {

    /**
     *  前置分发校验
     *
     *  @param  planDistribute        分发对象
     *  @return PlanDistributeResult  分发结果对象
     */
    PlanDistributeResult preValidate(PlanDistribute planDistribute);

    /**
     *  执行分发
     *
     *  @param  planDistribute        分发对象
     *  @return PlanDistributeResult  分发结果对象
     */
    PlanDistributeResult distribute(PlanDistribute planDistribute);

    /**
     *  解析返回响应结果
     *
     *  @param  planDistribute      分发实体
     *  @param  apiHttpMessage      返回HTTP消息
     *  @param  handler             处理器
     *  @return PlanDistributeFieldResult  计划返回字段
     */
     PlanDistributeField parseResponse(PlanDistribute planDistribute, ApiHttpMessage apiHttpMessage, V handler) throws Exception;

    /**
     *  分发结果处理
     *
     *  @param planDistributePost    分发后置对象
     *  @return PlanDistributeResult 最终匹配结果对象
     */
    PlanDistributeResult post(PlanDistributePost planDistributePost);
}
